package ink.liaoxuefeng.threaddemo.demo01;

/**
 * @author wangzhuangzhuang
 * @Description:
 * @date 2022-06-02 11:14
 */
public class TestDemo07 {
	public static void main(String[] args) throws InterruptedException {
		Thread t = new MyThread07();
		t.start();
		Thread.sleep(1); // 暂停1s
		t.interrupt(); // 中断t线程
		t.join(); // 等待t线程结束
		System.out.println("end");
	}
}

class MyThread07 extends Thread{
	@Override
	public void run(){
		int n = 0;
		while(!isInterrupted()){
			n++;
			System.out.println(n + " hello! ");
		}
	}
}
/**
 * main线程通过调用t.interrupt()方法中断t线程，
 * interrupt()方法仅仅向t线程发送“中断请求”
 * 至于t线程是否能够立刻响应，要看具体代码。
 *
 * main线程通过调用t.interrupt()从而通知t线程中断
 * 而此时t线程正位于hello.join()的等待中
 * 此方法会立刻抛出InterruptedException
 * 在t线程中捕获了InterruptedException
 * 从而可以准备结束该线程。
 * 在t线程结束前，对hello线程也进行interrupt()调用通知其中断
 * 若去掉这一行代码可发现hello线程仍然会继续运行，且JVM不会退出
 *
 * 另一个常用的中断线程的方法时设置标志位。
 * 通常会用一个running标志位来标识线程是否应该继续运行
 * 在外部线程中，通过HelloThread.running置为false即可让线程结束
 * */